﻿
namespace FastFood.Windows.Forms.Administracion.Otros
{
    using System;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Entities.Tipos;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;

    public partial class CwfSerieDocumentos : UserControl
    {
        public EstadoActual estadoActual;

        public CwfSerieDocumentos()
        {
            InitializeComponent();
        }

        private void CwfSerieDocumentos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cmbTipoDocuemento.Focus();
            this.correlativoBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.cmbTipoDocuemento.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.dgvCorrelativo.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.correlativoBindingSource.CancelEdit();
            this.dgvCorrelativo.Focus();
        }

        private void dgvCorrelativo_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadCorrelativo(this.correlativoBindingSource.Current as Correlativos);
            }
        }

        private void dgvCorrelativo_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.dgvCorrelativo.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                    }
                }
            }
        }

        private void cmbTiposDocumentos_SelectedIndexChanged(object sender, EventArgs e)
        {
            CorrelativosManager correlativoManager = new CorrelativosManager();
            if (this.cmbTiposDocumentos.SelectedIndex == -1)
            {
                try
                {
                    this.correlativoBindingSource.DataSource = correlativoManager.Listar();
                    this.correlativoBindingNavigator.BindingSource = this.correlativoBindingSource;
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
            else
            {
                try
                {
                    this.correlativoBindingSource.DataSource = correlativoManager.ListarByTipoDocumento(Convert.ToByte(this.cmbTiposDocumentos.SelectedIndex));
                    this.correlativoBindingNavigator.BindingSource = this.correlativoBindingSource;
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
        }

        private void InitialLoad()
        {
            this.cmbTipoDocuemento.Items.Clear();
            string[] documentos = Enum.GetNames(typeof(TipoDocumento));
            this.cmbTipoDocuemento.DataSource = documentos;
            this.cmbTiposDocumentos.Items.AddRange(documentos);
            this.cmbTiposDocumentos.SelectedIndex = -1;

            try
            {
                CorrelativosManager correlativoManager = new CorrelativosManager();
                this.correlativoBindingSource.DataSource = correlativoManager.Listar();
                this.correlativoBindingNavigator.BindingSource = this.correlativoBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadCorrelativo(Correlativos correlativo)
        {
            this.lblCorrelativoID.Text = correlativo.correlativoID.ToString();
            this.cmbTipoDocuemento.SelectedIndex = correlativo.tipoDocumento;
            this.txtSerie.Text = correlativo.serie;
            this.txtNInicio.Text = correlativo.numeroInicio.ToString();
            this.txtNFinal.Text = correlativo.numeroFinal.ToString();
            this.txtNActual.Text = correlativo.numeroActual.ToString();
        }

        private bool SaveData()
        {
            bool result = false;
            CorrelativosManager correlativoManager = new CorrelativosManager();
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        correlativoManager.Agregar(GetCorrelativo());
                        break;
                    case EstadoActual.Editar:
                        correlativoManager.Modificar(GetCorrelativo());
                        break;
                    case EstadoActual.Eliminar:
                        correlativoManager.Eliminar(Convert.ToInt16(this.lblCorrelativoID.Text));
                        this.correlativoBindingSource.RemoveCurrent();
                        break;
                }

                this.correlativoBindingSource.EndEdit();
                result = true;
                cmbTiposDocumentos_SelectedIndexChanged(this, new EventArgs());
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Correlativos GetCorrelativo()
        {
            return new Correlativos
            {
                correlativoID = Convert.ToInt16(this.lblCorrelativoID.Text),
                serie = this.txtSerie.Text,
                tipoDocumento = Convert.ToByte(this.cmbTipoDocuemento.SelectedIndex),
                numeroInicio = Convert.ToInt32(this.txtNInicio.Text),
                numeroFinal = Convert.ToInt32(this.txtNFinal.Text),
                numeroActual = Convert.ToInt32(this.txtNActual.Text)
            };
        }

        private bool ValidateData()
        {
            bool result = true;

            if (string.IsNullOrEmpty(this.txtSerie.Text))
            {
                this.errValidator.SetError(this.txtSerie, "Ingresar Serie.");
                result = false;
            }
            else if (this.txtSerie.Text.Length != 4)
            {
                this.errValidator.SetError(this.txtSerie, "La serie debe tener 4 caracteres exactamente.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtSerie, string.Empty);
            }

            if (string.IsNullOrEmpty(this.txtNInicio.Text))
            {
                this.errValidator.SetError(this.txtNInicio, "Ingresar Numero Inicial.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtNInicio, string.Empty);
            }

            if (string.IsNullOrEmpty(this.txtNFinal.Text))
            {
                this.errValidator.SetError(this.txtNFinal, "Ingresar Numero Final.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtNFinal, string.Empty);
            }

            if (string.IsNullOrEmpty(this.txtNActual.Text))
            {
                this.errValidator.SetError(this.txtNActual, "Ingresar Numero Actual.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtNActual, string.Empty);
            }

            if (this.cmbTipoDocuemento.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbTipoDocuemento, "Seleccionar Tipo Documento.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbTipoDocuemento, string.Empty);
            }

            if (result)
            {
                int inicio = Convert.ToInt32(this.txtNInicio.Text);
                int final = Convert.ToInt32(this.txtNFinal.Text);
                int actual = Convert.ToInt32(this.txtNActual.Text);

                if (inicio >= final)
                {
                    this.errValidator.SetError(this.txtNInicio, "Numero Inicial erroneo.");
                    result = false;
                }
                else if (actual < inicio)
                {
                    this.errValidator.SetError(this.txtNActual, "Numero Actual erroneo.");
                    result = false;
                }
                else if (actual > final)
                {
                    this.errValidator.SetError(this.txtNActual, "Numero actual erroneo.");
                    result = false;
                }
                else
                {
                    this.errValidator.Clear();
                }
            }
            if (result)
            {
                try
                {
                    if (CorrelativosManager.Instancia.ExisteSerie(Convert.ToInt32(lblCorrelativoID.Text), (byte)cmbTipoDocuemento.SelectedIndex, txtSerie.Text))
                    {
                        this.errValidator.SetError(this.txtSerie, "Ya existe un documento del mismo tipo, serie.");
                        result = false;
                    }
                    else
                    {
                        this.errValidator.SetError(this.txtSerie, string.Empty);
                    }

                    if (CorrelativosManager.Instancia.ExisteInterseccion(Convert.ToInt32(lblCorrelativoID.Text), (byte)cmbTipoDocuemento.SelectedIndex,
                        Convert.ToInt32(txtNInicio.Text), Convert.ToInt32(txtNFinal.Text)))
                    {
                        Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "Existen intersecciones de los numeros ingresados, con los de otra serie.");
                        result = false;
                    }
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.correlativoBindingNavigator.Enabled = valor;
            this.dgvCorrelativo.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.dgvCorrelativo.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.dgvCorrelativo.Enabled = true;
            }
        }

        private void ClearControls()
        {
            this.lblCorrelativoID.Text = "0";
            this.cmbTipoDocuemento.SelectedIndex = -1;
            this.txtSerie.Text = string.Empty;
            this.txtNInicio.Text = string.Empty;
            this.txtNFinal.Text = string.Empty;
            this.txtNActual.Text = string.Empty;
            this.errValidator.Clear();
        }

        private void txtNInicio_TextChanged(object sender, EventArgs e)
        {
            txtNActual.Text = txtNInicio.Text;
        }
    }
}
